from django.shortcuts import render
from rest_framework.views import APIView
from libs.captcha.captcha import captcha
from django_redis import get_redis_connection
from django.http import HttpResponse
from rest_framework import status
from . import constants
from rest_framework.response import Response

# Create your views here.

"""图片验证码的生成"""

class RegisterImageCodeView(APIView):
    """
        分析：前端需要发送GET请求：/verifications/imagecodes/(?P<image_code_id>.+)/
            1.用户点击图片验证码，生成一个图片验证码的唯一标识image_code_id，并触发ajax请求，将这个唯一标识返回给后端
            2.后端得到这个image_code_id后，通过第三方库(capatch)生成一个随机图片验证码
            3.后端需要以image_code_id作为图片的唯一标识，把图片验证码的内容存储在redis缓存中，并设置它的有效期
            4.把这个图片验证码返回给前端页面
    """

    def get(self,request,image_code_id):

        # 生成图片验证码
        text,image = captcha.generate_captcha()

        # 将验证码存储到redis数据库
        # 建立redis数据库缓存
        redis_conn = get_redis_connection('code')

        # 将图片验证码内容存储到reids数据库
        redis_conn.setex("image_%s"%image_code_id,constants.IMAGE_CODE_EXPIRE,text)

        # 将验证码图片返回给前端页面

        return HttpResponse(image,content_type="image/jpeg",status = status.HTTP_200_OK)



"""生成短信验证码"""
from .serializers import RegisterSmsCodeSerializer
from libs.yuntongxun.sms import CCP
class RegisterSmsCodeView(APIView):
    """
        分析：GET /verifications/smscodes/(?P<mobile>1[345789]\d{9})/?text=xxxx & image_code_id=xxxx
            前端点击发送短信按钮，给指定手机号发送短信，然后进行60s的倒计时，发送短信前需要对用户输入的图片验证码进行校验，图片验证的验证是为了防止用户频繁操作
            1.	前端需要将手机号，用户输入的验证码内容，以及记录图片验证码的UUID发送给后端
            2.	对图片验证码和uuid进行校验，对手机号进行校验
            3.	需要对手机号的发送记录进行判断，判断该用户在60s内是否发送过
            4.	生成短信
            5.	记录短信到redis数据库中，
            6.	发送短信
    """
    def get(self,request,mobile):
        # 获取前端传递的查询字符串参数
        data = request.query_params
        # 将data进行反序列化操作
        serializer =RegisterSmsCodeSerializer(data=data)
        # 对数据进行验证操作
        serializer.is_valid()

        redis_conn = get_redis_connection('code')

        # 获取记录状态获取短信的发送状态
        if redis_conn.get("sms_flag_%s"%mobile):
            return Response(status=status.HTTP_429_TOO_MANY_REQUESTS)

        # 生成短信
        from random import randint
        sms_code = "%06d"%randint(0,999999)

        # 记录短信到redis数据库
        redis_conn.setex("sms_%s"%mobile,5*60,sms_code)

        # 记录短息的发送状态
        redis_conn.setex("sms_flag_%s"%mobile,60,1)

        # # 发送短信
        # ccp = CCP()
        # ccp.send_template_sms(mobile,[sms_code],1)
        from celery_tasks.sms.tasks import send_sms_code
        send_sms_code.delay(mobile,sms_code)

        return Response({'message':'ok'})